package com.java.zhuiyun.api.file_manager.controller;

import com.java.zhuiyun.api.file_manager.entity.FileManager;
import com.java.zhuiyun.api.file_manager.service.FileManagerService;
import com.java.zhuiyun.common.response.CommonResult;
import com.java.zhuiyun.util.pageUtil.PageRequest;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;

/**
 * @ClassName FileManagerController
 * @Description TODO
 * @Author MJL
 * @Date 2023/8/15 20:19
 **/
@RestController
@RequestMapping("/fileManager")
@Slf4j
public class FileManagerController {
    @Resource
    private FileManagerService fileManagerService;
    // 记录日志信息
//    private Logger logger = LoggerFactory.getLogger()

    private final static String utf8 = "utf-8";

    /**
    * @Author MJL
    * @Description todo 查询所有文件
    * @Date 2023/8/15 20:40
    * @Return  * @param null
    */
    @GetMapping("/queryFile")
    public CommonResult queryFile (Integer id, String fileManagerName, PageRequest pageRequest) {
        log.info("数据" + id);
        return CommonResult.ok(fileManagerService.queryFile(fileManagerName,pageRequest,id));
    }
    /**
    * @Author MJL
    * @Description todo 根据登陆账号查询出自己上传的文件
    * @Date 2023/8/30 8:36
    * @Return  * @param null
    */
    @GetMapping("/getFileById")
    public CommonResult getFileById (Integer uploadedBy){
        return fileManagerService.getFileById(uploadedBy);
    }
    /**
    * @Author MJL
    * @Description todo 将文件上传到oss
    * @Date 2023/8/16 8:59
    * @Return  * @param null
    */
    @PostMapping("/uploadImage")
    public CommonResult uploadImage (@RequestParam("files")MultipartFile multipartFile) throws IOException {
        return CommonResult.ok(fileManagerService.uploadImage(multipartFile));
    }
    /**
    * @Author MJL
    * @Description todo 将教师不需要的视频删除
    * @Date 2023/9/1 14:01
    * @Return  * @param null
    */
    @DeleteMapping("/deleteFileManage")
    public CommonResult deleteFileManage(Integer fileManagerId){
        int i = fileManagerService.deleteFileManage(fileManagerId);
        if (i > 0){
            return CommonResult.ok("删除成功");
        } else {
            return CommonResult.error("删除失败");
        }
    }
    /**
    * @Author MJL
    * @Description todo 对小文件进行下载
    * @Date 2023/8/22 8:28
    * @Return  * @param null
    */
    @GetMapping("/downLoadFile/{fileManagerId}")
    public ResponseEntity<ByteArrayResource> downLoadFile(@PathVariable Integer fileManagerId, HttpServletRequest request) throws Exception {
        // 开始时的当前时间
        long l = System.currentTimeMillis();
        // 根据ID查出文件名称和路径
        FileManager fileManager = fileManagerService.downLoadFile(fileManagerId);
        // 获取文件名称
        String fileManagerName = fileManager.getFileManagerName();
        // 获取文件路径
        String filePath = fileManager.getFilePath();
        // 解决下载的文件的文件名出现中文乱码
        String userAgent = request.getHeader("User-Agent");
        if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
            // IE浏览器
            fileManagerName = java.net.URLEncoder.encode(fileManagerName, "UTF-8");
        } else {
            // 非IE浏览器
            fileManagerName = new String(fileManagerName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
        }
        // 下载文件
        URL url = new URL(filePath);
        // 跟url进行连接
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        // 设置HTTP请求方法为Get，他会告诉你服务器通过HTTP协议发送一个Get请求来获取资源
        connection.setRequestMethod("GET");
        // 创建输出流
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        // 获取输入流
        try (InputStream in = connection.getInputStream()) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            // 用于从输入流中读取数据，并将读取的数据写入指定的输出流
            while ((bytesRead = in.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
        } finally {
            // 关闭与文件下载服务器的连接，以释放资源并终止与服务器的连接
            connection.disconnect();
        }
        // 将输出流中的数据转化为字节数组，并将其存储在名为data的字节数组变量中华。
        byte[] data = outputStream.toByteArray();
        ByteArrayResource resource = new ByteArrayResource(data);
        // 结束的时间
        long l1 = System.currentTimeMillis();
        System.out.println("下载文件花费的时间为："+ (l1 - l) + "毫秒");
        // 将字节数组作为文件以附件的方式返回给客户端，使客户端能够下载并保存该文件。客户端会接收到一个带有指定文件名的二进制文件作为响应。
        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + fileManagerName)
                .contentType(MediaType.APPLICATION_OCTET_STREAM).contentLength(data.length)
                .body(resource);
    }
}
